package com.sds.service;

/**
 * @Author: sds
 *
 * @Description: 可见性
 */
public interface VisibilityService {

    /**
     * 1、volatile关键字
     * volatile就是让CPU每次操作这个数据时，必须立即同步到主内存，以及从主内存读取数据
     */
    void volatileMethod() throws InterruptedException;

    /**
     * 2、synchronized关键字
     * 获取锁资源之后，将内部涉及到的变量从CPU缓存中移除，必须去主内存中重新拿数据，
     * 在释放锁之后，会立即将CPU缓存中的数据同步到主内存
     */
    void synchronizedMethod() throws InterruptedException;

    /**
     * 3、lock锁
     * Lock锁是基于volatile实现的。Lock锁内部再进行加锁和释放锁时，会对一个由volatile修饰的state属性进行加减操作
     */
    void lockMethod();

    /**
     * 4、final关键字
     * final修饰的属性，在运行期间是不允许修改的，这样一来，就间接的保证了可见性，所有多线程读取final属性，值肯定是一样
     */
    void finalMethod();
}